"""
魔法方法是python面向对象的 高阶知识

魔法方法都是 双下划线开始双下划线结束

可以说, python的面向对象的构成都是由这些 魔法方法 所堆砌而成.

所以说, 每个生产出来的对象都会具备所有的 魔法方法

你可以自定义去重写这些魔法方法, 也可以就这么滴. 一般初学者只会用到其中的 __init__

其他魔法方法就先由他们去吧, 等我们逐步掌握好python后, 再来研究他们.

下面就介绍一下 __init__

这个魔法方法, 主要是用来 初始化对象属性

之前我们的例子中, 有车子有人类, 但是我们都是在创建它们之后才去修改它们的 实例属性

这种方式通常来说是不会看到的, 因为我们可以使用 __init__来帮我们做这件事

__init__属于 实例方法 所以会接收一个参数 self

__init__ 会在实例化属性后, 马上执行
"""
# class Human():
#     def __init__(self):
#         self.name = "jack"
#
#     def info(self):
#         print(self.name)
#
# jack = Human()
# jack.info()

# class Human():
#
#     def __init__(self, name, sex, age):
#         self.name = name
#         self.sex = sex
#         self.age = age
#
#     def info(self):
#         print(self.name)
#         print(self.sex)
#         print(self.age)
#
# jack = Human('jack', 'male', 18)  # __init__的参数必须要在实例化对象的时候传入类中
# rose = Human('rose', 'female', 19)
#
# jack.info()
# rose.info()


"""
__str__

不知道会不会有同学会试着打印一个对象, 如果有的话, 你会得到一个看不太懂的东西.

那么我们可以不可以定义打印对象是的输出, 答案是可以的.

我们回想一下 print 函数, 这个函数执行原理, 就是调用 打印对象的__str__
"""

class Human():

    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def info(self):
        print(self.name)
        print(self.sex)
        print(self.age)

    def __str__(self):
        return f"这是{self.name}"

jack = Human('jack', 'male', 18)  # __init__的参数必须要在实例化对象的时候传入类中
rose = Human('rose', 'female', 19)

print(jack)
print(rose)